home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #1 / Amiga Plus CD - 2000 - No. 1.iso / Tools / Dev / Meshwriter_lib / Library / source / StartUp.c < prev   
C/C++ Source or Header  |  1999-12-03  |  12KB  |  365 lines

  1. /*
  2. **      $VER: StartUp.c 0.2 (28.03.99)
  3. **
  4. **      Library startup-code and function table definition
  5. **
  6. **      (C) Copyright 1996-98 Andreas R. Kleinert
  7. **      All Rights Reserved.
  8. */
  9.  
  10. #define __USE_SYSBASE        // perhaps only recognized by SAS/C
  11.  
  12. #include <exec/types.h>
  13. #include <exec/memory.h>
  14. #include <exec/libraries.h>
  15. #include <exec/execbase.h>
  16. #include <exec/resident.h>
  17. #include <exec/initializers.h>
  18.  
  19.  
  20. #ifdef __MAXON__
  21. #include <pragma/exec_lib.h>
  22. #include <linkerfunc.h>
  23. #else
  24. #include <proto/exec.h>    // all other compilers
  25. #endif
  26. #include "compiler.h"
  27.  
  28.  
  29. #ifdef __GNUC__
  30. #include "../include/meshwrier/meshwriterbase.h"
  31. #elif VBCC
  32. #include "include/meshwriter/meshwriterbase.h"
  33. #else
  34. #include "/include/meshwriter/meshwriterbase.h"
  35. #endif
  36. #include "meshlib.h"
  37.  
  38.  
  39. extern ULONG __saveds __stdargs L_OpenLibs(struct MeshWriterBase *MeshWriterBase);
  40. extern void  __saveds __stdargs L_CloseLibs(void);
  41.  
  42. struct MeshWriterBase * __saveds ASM InitLib( register __a6 struct ExecBase    *sysbase GNUCREG(a6),
  43.                                            register __a0 SEGLISTPTR          seglist GNUCREG(a0),
  44.                                            register __d0 struct MeshWriterBase *mwb     GNUCREG(d0));
  45. struct MeshWriterBase * __saveds ASM OpenLib( register __a6 struct MeshWriterBase *MeshWriterBase GNUCREG(a6));
  46. SEGLISTPTR __saveds ASM CloseLib( register __a6 struct MeshWriterBase *MeshWriterBase GNUCREG(a6));
  47. SEGLISTPTR __saveds ASM ExpungeLib( register __a6 struct MeshWriterBase *mwb GNUCREG(a6));
  48. ULONG ASM ExtFuncLib(void);
  49.  
  50.  
  51. /* ----------------------------------------------------------------------------------------
  52.    ! LibStart:
  53.    !
  54.    ! If someone tries to start a library as an executable, it must return (LONG) -1
  55.    ! as result. That's what we are doing here.
  56.    ---------------------------------------------------------------------------------------- */
  57.  
  58. LONG ASM LibStart(void)
  59. {
  60.  return(-1);
  61. }
  62.  
  63.  
  64. /* ----------------------------------------------------------------------------------------
  65.    ! Function and Data Tables:
  66.    !
  67.    ! The function and data tables have been placed here for traditional reasons.
  68.    ! Placing the RomTag structure before (-> LibInit.c) would also be a good idea,
  69.    ! but it depends on whether you would like to keep the "version" stuff separately.
  70.    ---------------------------------------------------------------------------------------- */
  71.  
  72. extern APTR FuncTab [];
  73. /*extern struct MyDataInit DataTab;  */
  74. extern DataTab; /* DICE fix */
  75.                                   /* Instead you may place ROMTag + Datatab directly, here */
  76.                                   /* (see LibInit.c). This may fix "Installer" version     */
  77.                                   /* checking problems, too - try it.                      */
  78.  
  79. struct InitTable                       /* do not change */
  80. {
  81.  ULONG              LibBaseSize;
  82.  APTR              *FunctionTable;
  83.  struct MyDataInit *DataTable;
  84.  APTR               InitLibTable;
  85. } InitTab =
  86. {
  87.  (ULONG)               sizeof(struct MeshWriterBase),
  88.  (APTR              *) &FuncTab[0],
  89.  (struct MyDataInit *) &DataTab,
  90.  (APTR)                InitLib
  91. };
  92.  
  93. APTR FuncTab [] =
  94. {
  95.  OpenLib,
  96.  CloseLib,
  97.  ExpungeLib,
  98.  ExtFuncLib,
  99.  
  100.  MWLMeshNew,
  101.  MWLMeshDelete,
  102.  MWLMeshNameSet,
  103.  MWLMeshNameGet,
  104.  MWLMeshCopyrightSet,
  105.  MWLMeshCopyrightGet,
  106.  MWLMeshMaterialAdd,
  107.  MWLMeshMaterialNameSet,
  108.  MWLMeshMaterialNameGet,
  109.  MWLMeshMaterialAmbientColorSet,
  110.  MWLMeshMaterialAmbientColorGet,
  111.  MWLMeshMaterialShininessSet,
  112.  MWLMeshMaterialShininessGet,
  113.  MWLMeshMaterialTransparencySet,
  114.  MWLMeshMaterialTransparencyGet,
  115.  MWLMeshPolygonAdd,
  116.  MWLMeshPolygonMaterialSet,
  117.  MWLMeshPolygonVertexAdd,
  118.  MWLMeshTriangleAdd,
  119.  MWLMeshNumberOfMaterialsGet,
  120.  MWLMeshNumberOfPolygonsGet,
  121.  MWLMeshNumberOfVerticesGet,
  122.  MWLMeshCameraLightDefaultSet,
  123.  MWLMeshCameraPositionSet,
  124.  MWLMeshCameraPositionGet,
  125.  MWLMeshCameraLookAtSet,
  126.  MWLMeshCameraLookAtGet,
  127.  MWLMeshLightPositionSet,
  128.  MWLMeshLightPositionGet,
  129.  MWLMeshLightColorSet,
  130.  MWLMeshLightColorGet,
  131.  MWL3DFileFormatNamesGet,
  132.  MWL3DFileFormatIDGet,
  133.  MWL3DFileFormatExtensionGet,
  134.  MWL3DFileFormatNumberOfGet,
  135.  MWLMeshSave3D,
  136.  MWL2DFileFormatNamesGet,
  137.  MWL2DFileFormatIDGet,
  138.  MWL2DFileFormatExtensionGet,
  139.  MWL2DFileFormatNumberOfGet,
  140.  MWLMeshSave2D,
  141.  MWLDrawModeNamesGet,
  142.  MWLDrawModeIDGet,
  143.  MWLDrawModeNumberOfGet,
  144.  
  145.  MWLMeshVertexAdd,
  146.  MWLMeshPolygonVertexAssign,
  147.  
  148.  MWLMeshCTMReset,
  149.  MWLMeshTranslationChange,
  150.  MWLMeshTranslationGet,
  151.  MWLMeshScaleChange,
  152.  MWLMeshScaleGet,
  153.  MWLMeshRotationChange,
  154.  MWLMeshRotationGet,
  155.  
  156.  MWLMeshMaterialDiffuseColorSet,
  157.  MWLMeshMaterialDiffuseColorGet,
  158.  
  159.  (APTR) ((LONG)-1)
  160. };
  161.  
  162.  
  163. extern struct MeshWriterBase *MeshWriterBase;
  164.  
  165. /* ----------------------------------------------------------------------------------------
  166.    ! InitLib:
  167.    !
  168.    ! This one is single-threaded by the Ramlib process. Theoretically you can do, what
  169.    ! you like here, since you have full exclusive control over all the library code and data.
  170.    ! But due to some bugs in Ramlib V37-40, you can easily cause a deadlock when opening
  171.    ! certain libraries here (which open other libraries, that open other libraries, that...)
  172.    !
  173.    ---------------------------------------------------------------------------------------- */
  174.  
  175. struct MeshWriterBase * __saveds ASM InitLib( register __a6 struct ExecBase      *sysbase GNUCREG(a6),
  176.                                            register __a0 SEGLISTPTR            seglist GNUCREG(a0),
  177.                                            register __d0 struct MeshWriterBase   *mwb     GNUCREG(d0))
  178. {
  179.  MeshWriterBase = mwb;
  180.  
  181.  MeshWriterBase->mwb_SysBase = sysbase;
  182.  MeshWriterBase->mwb_SegList = seglist;
  183.  
  184.  if(L_OpenLibs(MeshWriterBase)) return(MeshWriterBase);
  185.  
  186.  L_CloseLibs();
  187.  
  188.   {
  189.    ULONG negsize, possize, fullsize;
  190.    UBYTE *negptr = (UBYTE *) MeshWriterBase;
  191.  
  192.    negsize  = MeshWriterBase->mwb_LibNode.lib_NegSize;
  193.    possize  = MeshWriterBase->mwb_LibNode.lib_PosSize;
  194.    fullsize = negsize + possize;
  195.    negptr  -= negsize;
  196.  
  197.    FreeMem(negptr, fullsize);
  198.  
  199.    #ifdef __MAXON__
  200.    CleanupModules();
  201.    #endif
  202.   }
  203.  
  204.  return(NULL);
  205. }
  206.  
  207. /* ----------------------------------------------------------------------------------------
  208.    ! OpenLib:
  209.    !
  210.    ! This one is enclosed within a Forbid/Permit pair by Exec V37-40. Since a Wait() call
  211.    ! would break this Forbid/Permit(), you are not allowed to start any operations that
  212.    ! may cause a Wait() during their processing. It's possible, that future OS versions
  213.    ! won't turn the multi-tasking off, but instead use semaphore protection for this
  214.    ! function.
  215.    !
  216.    ! Currently you only can bypass this restriction by supplying your own semaphore
  217.    ! mechanism.
  218.    ---------------------------------------------------------------------------------------- */
  219.  
  220. struct MeshWriterBase * __saveds ASM OpenLib( register __a6 struct MeshWriterBase *MeshWriterBase GNUCREG(a6))
  221. {
  222.  #ifdef __MAXON__
  223.  GetBaseReg();
  224.  InitModules();
  225.  #endif
  226.  
  227.  MeshWriterBase->mwb_LibNode.lib_OpenCnt++;
  228.  
  229.  MeshWriterBase->mwb_LibNode.lib_Flags &= ~LIBF_DELEXP;
  230.  
  231.  return(MeshWriterBase);
  232. }
  233.  
  234. /* ----------------------------------------------------------------------------------------
  235.    ! CloseLib:
  236.    !
  237.    ! This one is enclosed within a Forbid/Permit pair by Exec V37-40. Since a Wait() call
  238.    ! would break this Forbid/Permit(), you are not allowed to start any operations that
  239.    ! may cause a Wait() during their processing. It's possible, that future OS versions
  240.    ! won't turn the multi-tasking off, but instead use semaphore protection for this
  241.    ! function.
  242.    !
  243.    ! Currently you only can bypass this restriction by supplying your own semaphore
  244.    ! mechanism.
  245.    ---------------------------------------------------------------------------------------- */
  246.  
  247. SEGLISTPTR __saveds ASM CloseLib( register __a6 struct MeshWriterBase *MeshWriterBase GNUCREG(a6))
  248. {
  249.  MeshWriterBase->mwb_LibNode.lib_OpenCnt--;
  250.  
  251.  if(!MeshWriterBase->mwb_LibNode.lib_OpenCnt)
  252.   {
  253.    if(MeshWriterBase->mwb_LibNode.lib_Flags & LIBF_DELEXP)
  254.     {
  255.      return( ExpungeLib(MeshWriterBase) );
  256.     }
  257.   }
  258.  
  259.  return(NULL);
  260. }
  261.  
  262. /* ----------------------------------------------------------------------------------------
  263.    ! ExpungeLib:
  264.    !
  265.    ! This one is enclosed within a Forbid/Permit pair by Exec V37-40. Since a Wait() call
  266.    ! would break this Forbid/Permit(), you are not allowed to start any operations that
  267.    ! may cause a Wait() during their processing. It's possible, that future OS versions
  268.    ! won't turn the multi-tasking off, but instead use semaphore protection for this
  269.    ! function.
  270.    !
  271.    ! Currently you only could bypass this restriction by supplying your own semaphore
  272.    ! mechanism - but since expunging can't be done twice, one should avoid it here.
  273.    ---------------------------------------------------------------------------------------- */
  274.  
  275. SEGLISTPTR __saveds ASM ExpungeLib( register __a6 struct MeshWriterBase *mwb GNUCREG(a6))
  276. {
  277.  struct MeshWriterBase *MeshWriterBase = mwb;
  278.  SEGLISTPTR seglist;
  279.  
  280.  if(!MeshWriterBase->mwb_LibNode.lib_OpenCnt)
  281.   {
  282.    ULONG negsize, possize, fullsize;
  283.    UBYTE *negptr = (UBYTE *) MeshWriterBase;
  284.  
  285.    seglist = MeshWriterBase->mwb_SegList;
  286.  
  287.    Remove((struct Node *)MeshWriterBase);
  288.  
  289.    L_CloseLibs();
  290.  
  291.    negsize  = MeshWriterBase->mwb_LibNode.lib_NegSize;
  292.    possize  = MeshWriterBase->mwb_LibNode.lib_PosSize;
  293.    fullsize = negsize + possize;
  294.    negptr  -= negsize;
  295.  
  296.    FreeMem(negptr, fullsize);
  297.  
  298.    #ifdef __MAXON__
  299.    CleanupModules();
  300.    #endif
  301.  
  302.    return(seglist);
  303.   }
  304.  
  305.  MeshWriterBase->mwb_LibNode.lib_Flags |= LIBF_DELEXP;
  306.  
  307.  return(NULL);
  308. }
  309.  
  310. /* ----------------------------------------------------------------------------------------
  311.    ! ExtFunct:
  312.    !
  313.    ! This one is enclosed within a Forbid/Permit pair by Exec V37-40. Since a Wait() call
  314.    ! would break this Forbid/Permit(), you are not allowed to start any operations that
  315.    ! may cause a Wait() during their processing. It's possible, that future OS versions
  316.    ! won't turn the multi-tasking off, but instead use semaphore protection for this
  317.    ! function.
  318.    !
  319.    ! Currently you only can bypass this restriction by supplying your own semaphore
  320.    ! mechanism - but since this function currently is unused, you should not touch
  321.    ! it, either.
  322.    ---------------------------------------------------------------------------------------- */
  323.  
  324. ULONG ASM ExtFuncLib(void)
  325. {
  326.  return(NULL);
  327. }
  328.  
  329. struct MeshWriterBase *MeshWriterBase = NULL;
  330.  
  331.  
  332. /* ----------------------------------------------------------------------------------------
  333.    ! __SASC stuff:
  334.    !
  335.    ! This is only for SAS/C - its intention is to turn off internal CTRL-C handling
  336.    ! for standard C functions and to avoid calls to exit() et al.
  337.    ---------------------------------------------------------------------------------------- */
  338.  
  339. #ifdef __SASC
  340.  
  341. #ifdef ARK_OLD_STDIO_FIX
  342.  
  343. ULONG XCEXIT       = NULL; /* These symbols may be referenced by    */
  344. ULONG _XCEXIT      = NULL; /* some functions of sc.lib, but should  */
  345. ULONG ONBREAK      = NULL; /* never be used inside a shared library */
  346. ULONG _ONBREAK     = NULL;
  347. ULONG base         = NULL; /* Note, that XCEXIT/ONBREAK actually    */
  348. ULONG _base        = NULL; /* should have been defined as functions */
  349. ULONG ProgramName  = NULL; /* and not as ULONGs...                  */
  350. ULONG _ProgramName = NULL;
  351. ULONG StackPtr     = NULL;
  352. ULONG _StackPtr    = NULL;
  353. ULONG oserr        = NULL;
  354. ULONG _oserr       = NULL;
  355. ULONG OSERR        = NULL;
  356. ULONG _OSERR       = NULL;
  357.  
  358. #endif /* ARK_OLD_STDIO_FIX */
  359.  
  360. void __regargs __chkabort(void) { }  /* a shared library cannot be    */
  361. void __regargs _CXBRK(void)     { }  /* CTRL-C aborted when doing I/O */
  362.  
  363. #endif /* __SASC */
  364.  
  365.